﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NQueueing
{
    /// <summary>
    /// СМО.
    /// </summary>
    /// <typeparam name="T">Тип элемента очереди.</typeparam>
    public interface IServerQueue<T>
    {
        /// <summary>
        /// Пытается поместить объект <paramref name="item"/> в очередь обработки.
        /// </summary>
        /// <param name="item">Элемент обработки.</param>
        /// <returns>Результат помещения в очередь.</returns>
        EnqueueStatus TryEnqueue(T item);

        /// <summary>
        /// Пытается поместить массив объектов <paramref name="items"/> в очередь обработки.
        /// </summary>
        /// <param name="items">Массив элементов обработки.</param>
        /// <returns>Результат помещения в очередь.</returns>
        EnqueueStatus TryEnqueue(T[] items);

        /// <summary>
        /// Помещает объект <paramref name="item"/> в очередь обработки. 
        /// При помещении объекта в очередь, в случае если очередь полна, ждет и снова пытается положить.
        /// </summary>
        /// <param name="item">Элемент обработки.</param>
        void Enqueue(T item);

        /// <summary>
        /// Помещает объект <paramref name="item"/> в очередь обработки. 
        /// При помещении объекта в очередь, в случае если очередь полна, ждет и снова пытается положить.
        /// </summary>
        /// <param name="item">Элемент обработки.</param>
        /// <param name="timeout">Время ожидания между попытками.</param>
        void Enqueue(T item, int timeout);

        /// <summary>
        /// Помещает массив объектов <paramref name="items"/> в очередь обработки. 
        /// При помещении массива объектов в очередь, в случае если очередь полна, ждет и снова пытается положить массив целиком.
        /// </summary>
        /// <param name="items">Массив элементов обработки.</param>
        void Enqueue(T[] item);

        /// <summary>
        /// Помещает массив объектов <paramref name="items"/> в очередь обработки. 
        /// При помещении массива объектов в очередь, в случае если очередь полна, ждет и снова пытается положить массив целиком.
        /// </summary>
        /// <param name="items">Массив элементов обработки.</param>
        /// <param name="timeout">Время ожидания между попытками.</param>
        void Enqueue(T[] item, int timeout);

        /// <summary>
        /// Запускает рабочие потоки.
        /// </summary>
        void Start();

        /// <summary>
        /// Останавливает прием заявок в очередь, и завершает обработку.
        /// </summary>
        void Close();

        /// <summary>
        /// Прерывает обработку очередей.
        /// </summary>
        void Abort();
    }
}
